package com.qf;

import org.omg.PortableInterceptor.INACTIVE;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;

//画板类
public class BirdGame extends JPanel {
    public BufferedImage bg, sImage, gameover;
    //BufferedImage图片缓存区
    public Ground ground;
    public Bird bird;
    public Column column;

    public int state;//游戏状态
    public static final int START = 0;//游戏开始
    public static final int RUNNING = 1;//游戏进行中
    public static final int GAMEOVER = 2;//游戏结束
    public int score = 0;
    public Column columns[];


    //无参构造方法，用来属性赋值
    public BirdGame() {
        try {
            //读取项目中图片,赋值给属性:bg
            bg = ImageIO.read(getClass().getResource("image/bg.png"));
            sImage = ImageIO.read(getClass().getResource("image/start.png"));
            gameover = ImageIO.read(getClass().getResource("image/gameover.png"));
            //地面类初始化
            ground = new Ground();
            bird = new Bird();
            column = new Column();
            columns = new Column[2];//创建管道数组
            columns[0] = new Column();//创建第一个管道
            columns[1] = new Column();//创建第二个管道
        } catch (IOException e) {
            System.out.println("背景图片未找到");
        }
    }

    //关键画画方法
    @Override
    public void paint(Graphics g) {//绘制方法
        super.paint(g);
        //图片 0默认位置  imageObserver要通知的对象
        g.drawImage(bg, 0, 0, null);
        switch (state) {
            case START:
                g.drawImage(sImage, 0, 0, null);//游戏开始界面
                break;
            case RUNNING:
                g.drawImage(columns[0].cImage, columns[0].x, columns[0].y, null);//添加管道1图片
                g.drawImage(columns[1].cImage, columns[1].x, columns[1].y, null);//添加管道2图片               break;
                break;
            case GAMEOVER:
                g.drawImage(gameover, 0, 0, null);//游戏结束界面
                break;
            default:
                break;
        }
        g.drawImage(ground.moveGround, ground.x, ground.y, null);//绘制地面
        g.drawImage(bird.moveBird, bird.x, bird.y, null);//绘制鸟
        setScore(g);
    }

    private void setScore(Graphics g) {
        //设置积分
        Font font = new Font(Font.SERIF, Font.ITALIC, 40);
        //把字体加入绘制
        g.setFont(font);
        //设置颜色
        g.setColor(Color.WHITE);
        g.drawString(score + "", 40, 60);

    }

    public void action() {
        System.out.println("点击事件前==========" + state);
        //绑定监听器
        this.addMouseListener(new BridMouseListener());
        while (true) {
            switch (state) {
                case START://游戏开始
                    ground.step();//地面移动
                    bird.fly();//小鸟飞
                    break;
                case RUNNING://游戏进行中
                    ground.step();//地面移动
                    bird.fly();//小鸟飞
                    bird.down();//小鸟鼠标移动
                    //在游戏进行中判断小鸟是否飞过管道
                    for (int i = 0; i < columns.length; i++) {//循环遍历管道
                        Column column = columns[i];
                        column.step();//管道1移动的方法
                        //调用小鸟碰撞管道结束的方法,返回值为true的话代表小鸟碰到管道,状态改为游戏结束
                        boolean b = GetHitColunm(column);
                        if (b) {
                            state = GAMEOVER;
                            break;
                        }
                        //判断小鸟飞过管道: 小鸟的x轴坐标 == 管道的x轴坐标+管道的宽度
                        if (bird.x == column.x + column.width) {
                            //分数自增
                            score++;
                        }
                    }
                    if (GetHeiGround()) {//当小鸟碰到地面时结束
                        state = GAMEOVER;
                        //游戏结束,重新开始时分数清零


                    }
                    break;
                case GAMEOVER://游戏结束
                    score = 0;
                    break;
            }
            repaint();////再次调用绘画方法,重新画出地面新位置,小鸟新位置,管道新位置
            try {
                Thread.sleep(1000 / 60);//线程控制速度
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }

    //小鸟碰到地面结束的方法
    public boolean GetHeiGround() {//碰到了返回true 没碰到返回false
        if (bird.y < ground.y - bird.height && bird.y > -bird.height) {
            return false;
        } else {
            return true;
        }
    }


    class BridMouseListener extends MouseAdapter {//内部类:鼠标监听事件

        @Override
        public void mousePressed(MouseEvent e) {//鼠标按下事件
            super.mousePressed(e);
            switch (state) {
                case START://游戏开始
                    state = RUNNING;
                    break;
                case RUNNING://游戏进行中
                    //给小鸟初始速度
                    bird.up();
                    break;
                case GAMEOVER://游戏结束,重新开始,初始化数据
                    System.out.println(state);
                    //如果不初始化小鸟数据,游戏开始时,小鸟还是在地上
                    state = START;
                    bird.x = 120;//初始化小鸟的x轴
                    bird.y = 220;//初始化小鸟的y轴
                    bird.speed = 0;//初始化小鸟的速度
                    Column.count = 0;//通过类名初始化管道的个数
                    columns[0] = new Column();//初始化两个管道
                    columns[1] = new Column();
                    break;
            }
        }
    }

    //小鸟碰撞管道结束的方法
    public boolean GetHitColunm(Column column) {
        //先考虑x轴是否在范围内
        //1.小鸟在管道左侧: 小鸟的x轴坐标 >= 管道的x轴坐标 - 小鸟图片的宽度
        //2.小鸟在管道右侧: 小鸟的x轴坐标 <= 管道的x轴坐标 + 管道图片的宽度
        if (bird.x >= column.x - bird.width && bird.x <= column.x + column.width) {
            //小鸟在范围内
            //考虑小鸟的y轴坐标
            //半个管道的长度=管道的高度/2 - 管道的缝隙/2
            //1.小鸟在上半部分:小鸟的y轴坐标 <= 管道的y轴坐标 + 半个管道的长度
            //2.小鸟在下半部分:小鸟的y轴坐标 >= 管道的y轴坐标 + 管道的高度/2 +管道的缝隙/2 -小鸟的高度
            if (bird.y <= (column.y + column.height / 2 - column.gap / 2)
                    || bird.y >= (column.y + column.height / 2 + column.gap / 2 - bird.height)) {
                //小鸟不在缝隙中
                return true;
            } else {
                return false;
            }
        } else {
            //小鸟不在范围内
            return false;
        }

    }
}
